﻿// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// ReSharper disable CheckNamespace
// ReSharper disable CommentTypo
// ReSharper disable IdentifierTypo
// ReSharper disable StringLiteralTypo
// ReSharper disable UnusedMember.Global
// ReSharper disable UnusedType.Global

/* WordShortener.cs --
 * Ars Magna project, http://arsmagna.ru
 */

#nullable enable

namespace ManagedIrbis.Morphology
{
    /// <summary>
    ///
    /// </summary>
    public sealed class WordShortener
    {
        #region Properties

        /// <summary>
        /// Рекомендуемые сокращения по ГОСТ 7.0.12-2011.
        /// </summary>
        public static string[] Gost =
        {
            "авантитул", "авантит.",
            "август", "авг.",
            "автограф", "автогр.",
            "автономный", "авт.",
            "автор", "авт.",
            "автореферат", "автореф.",
            "авторское свидетельство", "авт. свид.",
            "автотипия", "автотип.",
            "адаптация", "адапт.",
            "административный", "адм.",
            "адмирал", "адм.",
            "азербайджанский", "азерб.",
            "академик", "акад.",
            "академия", "акад.",
            "акватинта", "акват.",
            "аккомпанемент", "аккомп.",
            "алфавитный", "алф.",
            "альманах", "альм.",
            "американский", "амер.",
            "аннотация", "аннот.",
            "ансамбль", "анс.",
            "антология", "антол.",
            "апостол", "ап.",
            "аппликатура", "аппликат.",
            "апрель", "апр.",
            "аранжировка", "аранж.",
            "армянский", "арм.",
            "архив", "арх.",
            "архидиакон", "архидиак.",
            "архиепископ", "архиеп.",
            "архимандрит", "архим.",
            "архипелаг", "арх.",
            "ассоциация", "ассоц.",
            "атлас", "атл.",
            "атолл", "ат.",
            "аудиовизуальный", "ав.",
            "африканский", "афр.",
            "банка", "б-ка",
            "барон", "бар.",
            "без года", "б. г.",
            "без издательства", "б. и.",
            "без масштаба", "б. м-ба",
            "без места", "б. м.",
            "без цены", "б. ц.",
            "бесплатно", "беспл.",
            "библиография", "библиогр.",
            "библиотека", "б-ка",
            "библиотечка", "б-чка",
            "библиотечный", "библ.",
            "биобиблиография", "биобиблиогр.",
            "биография", "биогр.",
            "бланковая", "бланк.",
            "болото", "бол.",
            "братья", "бр.",
            "брошюра", "бр.",
            "бухта", "бух.",
            "бюллетень", "бюл.",
            "введение", "введ.",
            "вводится", "ввод.",
            "ведомости", "вед.",
            "великомученик", "вмч.",
            "великомученица", "вмц.",
            "величина", "велич.",
            "верста", "в.",
            "верховье", "верх.",
            "вершина", "верш.",
            "вестник", "вестн.",
            "Ветхий Завет", "В. 3.",
            "вечерний", "веч.",
            "видеокассета", "вк.",
            "видеофонограмма", "видеофоногр.",
            "вкладной лист", "вкл. л.",
            "включительно", "включ.",
            "владение", "влад.",
            "водопад", "вдп.",
            "водохранилище", "вдхр.",
            "возвышенность", "возв.",
            "вокально-инструментальный", "вок.-инстр.",
            "волость", "вол.",
            "вопросы", "вопр.",
            "воспроизведение", "воспр.",
            "Восточная долгота", "В",
            "восточный", "вост.",
            "впадина", "впад.",
            "вспомогательный", "вспом.",
            "вступление", "вступ.",
            "вулкан", "влк.",
            "выпуск", "вып.",
            "выпускные данные", "вып. дан.",
            "выставка", "выст.",
            "высший", "высш.",
            "выходные данные", "вых. дан.",
            "вьетнамский", "вьет.",
            "газета", "газ.",
            "гармонизатор", "гармониз.",
            "гармонизация", "гармониз.",
            "генерал", "ген.",
            "герцог", "герц.",
            "глава", "гл.",
            "главный", "гл.",
            "глубокая печать", "глуб. печ.",
            "голландский", "гол.",
            "город", "г.",
            "городской", "гор.",
            "государственный", "гос.",
            "государство", "гос-во",
            "гравер", "грав.",
            "гравюра", "грав.",
            "гравюра на дереве", "грав. на дер.",
            "гравюра на металле", "грав. на мет.",
            "грампластинка", "грп.",
            "граф", "гр.",
            "график", "граф.",
            "графство", "граф.",
            "губерния", "губ.",
            "действие", "д.",
            "декабрь", "дек.",
            "депонированный", "деп.",
            "деревня", "д.",
            "дефектный", "деф.",
            "деятель", "деят.",
            "диаграмма", "диагр.",
            "диакон", "диак.",
            "диаметр", "диам.",
            "диапозитив", "диапоз.",
            "диафильм", "дф.",
            "дискография", "дискогр.",
            "дискуссия", "дискус.",
            "диссертация", "дис.",
            "добавление", "доб.",
            "доклад", "докл.",
            "доктор", "д-р",
            "документ", "док.",
            "долгота", "долг.",
            "долина", "дол.",
            "допечатка", "допеч.",
            "дополнение", "доп.",
            "доработка", "дораб.",
            "дорога", "дор.",
            "дорожные знаки", "дор. зн.",
            "доцент", "доц.",
            "духовный", "дух.",
            "духовой", "дух.",
            "ежедневный", "ежедн.",
            "епископ", "еп.",
            "железная дорога", "ж. д.",
            "железнодорожный", "ж.-д.",
            "журнал", "журн.",
            "заведующий", "зав.",
            "завод", "з-д",
            "заглавие", "загл.",
            "залив", "зал.",
            "заместитель", "зам.",
            "замечание", "замеч.",
            "Западная долгота", "3",
            "западный", "зап.",
            "записки", "зап.",
            "заповедник", "заповед.",
            "звук", "зв.",
            "значительно", "знач.",
            "игумен", "игум.",
            "при именах собственных", "иеродиакон",
            "иерод.", "то же",
            "иеромонах", "иером.",
            "при именах собственных", "иеросхимонах",
            "иеросхим.", "то же",
            "известия", "изв.",
            "извлечение", "извлеч.",
            "изготовитель", "изгот.",
            "издание", "изд.",
            "издатель", "изд.",
            "издательство", "изд-во",
            "изложение", "излож.",
            "изменение", "изм.",
            "изображение", "изобр.",
            "изобретение", "изобрет.",
            "изокомбинат", "изокомб.",
            "иллюстратор", "ил.",
            "иллюстрация", "ил.",
            "имени", "им.",
            "император", "имп.",
            "инженер", "инж.",
            "институт", "ин-т",
            "инструмент", "инстр.",
            "инструментовка", "инструм.",
            "информационный", "информ.",
            "информация", "информ.",
            "иподиакон", "иподиак.",
            "ирландский", "ирл.",
            "исландский", "исл.",
            "исполнение", "исполн.",
            "исполнитель", "исполн.",
            "исправление", "испр.",
            "исследование", "исслед.",
            "исторический", "ист.",
            "итальянский", "итал.",
            "кабинет", "каб.",
            "казахский", "каз.",
            "канал", "кан.",
            "кандидат", "канд.",
            "кантон", "кант.",
            "капитан", "кап.",
            "карандаш", "каранд.",
            "карта", "к.",
            "картина", "карт.",
            "картограмма", "картогр.",
            "картограф", "картогр.",
            "карточка", "карт.",
            "каталог", "кат.",
            "кафедра", "каф.",
            "квартал", "кв.",
            "киностудия", "к/с",
            "кинофильм", "кф.",
            "киргизский", "кирг.",
            "класс", "кл.",
            "книга", "кн.",
            "книгоиздательство", "кн-во",
            "книжный магазин", "кн. маг.",
            "книжный склад", "кн. скл.",
            "княгиня", "кн.",
            "князь", "кн.",
            "коллежский асессор", "к. ас.",
            "колонка", "кол.",
            "комиссия", "комис.",
            "комитет", "ком.",
            "комментарий", "коммент.",
            "комментатор", "коммент.",
            "компания", "Ко",
            "композитор", "комп.",
            "конгресс", "конгр.",
            "конференция", "конф.",
            "концертный", "конц.",
            "кооперация", "кооп.",
            "координаты", "коорд.",
            "копейка", "к.",
            "копировал", "копир.",
            "копировальщик", "копир.",
            "копия", "коп.",
            "коробка", "кор.",
            "корреспондент", "кор.",
            "котловина", "котл.",
            "краевой", "краев.",
            "крепость", "креп.",
            "ксерокопия", "ксерокоп.",
            "ксилография", "ксилогр.",
            "курорт", "кур.",
            "лаборатория", "лаб.",
            "лагуна", "лаг.",
            "ледник", "ледн.",
            "лейб-гвардия", "л.-гв.",
            "лейтенант", "лейт.",
            "либретто", "либр.",
            "лиман", "лим.",
            "лист", "л.",
            "литература", "лит.",
            "литография", "литогр.",
            "мажор", "маж.",
            "македонский", "макед.",
            "маршрут", "маршр.",
            "масштаб", "м-б",
            "математический", "мат.",
            "медицинский", "мед.",
            "меридиан", "мерид.",
            "месторождение", "месторожд.",
            "месяц", "мес.",
            "металлография", "металлогр.",
            "механический", "мех.",
            "микрокарта", "мк.",
            "микрокопия", "мкоп.",
            "микрофильм", "мф.",
            "микрофотокопия", "мфотокоп.",
            "министерство", "м-во",
            "минор", "мин.",
            "митрополит", "митр.",
            "младший", "мл.",
            "монография", "моногр.",
            "музыка", "муз.",
            "мыс", "м.",
            "надворный советник", "надв. сов.",
            "надзаголовок", "надзаг.",
            "название", "назв.",
            "напечатанный", "напеч.",
            "народный", "нар.",
            "населенный пункт", "нп",
            "наследник", "насл.",
            "научный", "науч.",
            "национальный", "нац.",
            "начало", "нач.",
            "неизвестный художник", "неизв. худож.",
            "немецкий", "нем.",
            "нидерландский", "нидерл.",
            "низменность", "низм.",
            "низовье", "низ.",
            "Новый Завет", "Н. 3.",
            "номер доски", "н. д.",
            "номограмма", "номогр.",
            "норвежский", "норв.",
            "нотография", "нотогр.",
            "ноты", "нот.",
            "ноябрь", "нояб.",
            "оазис", "оаз.",
            "областной", "обл.",
            "область", "обл.",
            "обложка", "обл.",
            "обозначение", "обозн.",
            "обработка", "обраб.",
            "общество", "о-во",
            "общий", "общ.",
            "объединение", "об-ние",
            "объединенный", "объед.",
            "оглавление", "огл.",
            "озеро", "оз.",
            "около", "ок.",
            "окрестности", "окрест.",
            "округ", "окр.",
            "окружной", "окр.",
            "октябрь", "окт.",
            "опубликованный", "опубл.",
            "опус", "оп.",
            "организация", "орг.",
            "ординарный профессор", "орд. проф.",
            "оригинал", "ориг.",
            "ориентирование", "ориент.",
            "оркестр", "орк.",
            "оркестровка", "оркестр.",
            "основатель", "осн.",
            "остров", "о-в",
            "острова", "о-ва",
            "ответственный", "отв.",
            "отдел", "отд.",
            "отделение", "отд-ние",
            "отец", "о.",
            "отмель", "отм.",
            "отпечатанный", "отпеч.",
            "оттиск", "отт.",
            "оформление", "оформ.",
            "пагинация", "паг.",
            "памятник", "пам.",
            "параллель", "парал.",
            "партитура", "партит.",
            "партия", "парт.",
            "патент", "пат.",
            "педагогический", "пед.",
            "перевал", "пер.",
            "перевод", "пер.",
            "переводчик", "пер.",
            "переиздание", "переизд.",
            "переложение", "перелож.",
            "перепечатка", "перепеч.",
            "переплет", "пер.",
            "переработка", "перераб.",
            "персидский", "перс.",
            "перспективный", "перспект.",
            "перфокарта", "перфок.",
            "перфолента", "перфол.",
            "петербургский", "петерб.",
            "печатный", "печ.",
            "пещера", "пещ.",
            "план", "пл.",
            "плоскогорье", "плскг.",
            "плотина", "плот.",
            "побережье", "побер.",
            "подготовка", "подгот.",
            "подзаголовок", "подзаг.",
            "подобрал", "подобр.",
            "полезные ископаемые", "полез. ископ.",
            "полковник", "полк.",
            "полный", "полн.",
            "половина", "пол.",
            "полуостров", "п-ов",
            "популярный", "попул.",
            "порог", "пор.",
            "портрет", "портр.",
            "поручик", "пор.",
            "посвящение", "посвящ.",
            "поселок", "пос.",
            "послесловие", "послесл.",
            "постановка", "пост.",
            "постановщик", "пост.",
            "почтовый", "почт.",
            "праведный", "прав.",
            "предисловие", "предисл.",
            "предместье", "предм.",
            "предметный", "предм.",
            "председатель", "пред.",
            "прекращен", "прекр.",
            "преподобный", "прп.",
            "препринт", "препр.",
            "пресвитер", "пресв.",
            "приват-доцент", "прив.-доц.",
            "приложение", "прил.",
            "примечание", "примеч.",
            "приплетено", "припл.",
            "присяжный поверенный", "присяж. пов.",
            "провинция", "пров.",
            "программа", "прогр.",
            "продолжение", "продолж.",
            "проектируемый", "проектир.",
            "проекция", "пр-ция",
            "производственный", "произв.",
            "производство", "пр-во",
            "пролив", "прол.",
            "промышленность", "пром-сть",
            "промышленный", "пром.",
            "пророк", "прор.",
            "протодиакон", "протодиак.",
            "протоиерей", "прот.",
            "протопресвитер", "протопресв.",
            "профессиональный", "проф.",
            "профессор", "проф.",
            "проход", "прх.",
            "прямое восхождение", "ПВ",
            "прямоугольная сетка", "прямоуг. сетка",
            "псевдоним", "псевд.",
            "публикация", "публ.",
            "публичный", "публ.",
            "пустыня", "пуст.",
            "равновеликая", "равновел.",
            "равнодействие", "рд.",
            "равнопромежуточная", "равнопром.",
            "равноугольная", "равноуг.",
            "раздел", "разд.",
            "раздельная пагинация", "разд. паг.",
            "разработка", "разраб.",
            "район", "р-н",
            "районный", "район.",
            "распространение", "распростр.",
            "расстояние", "расст.",
            "расширенный", "расш.",
            "регистр", "рег.",
            "редактор", "ред.",
            "редакционная коллегия", "редкол.",
            "редколлегия", "редкол.",
            "редакция", "ред.",
            "режиссер", "реж.",
            "резцовая гравюра", "резц. грав.",
            "резюме", "рез.",
            "река", "р.",
            "рекомендательный", "рек.",
            "реконструируемый", "реконстр.",
            "репринт", "репр.",
            "репрография", "репрогр.",
            "репродукция", "репрод.",
            "республика", "респ.",
            "ретроспективный", "ретросп.",
            "реферат", "реф.",
            "реферативный журнал", "реф. журн.",
            "референт", "реф.",
            "рецензия", "рец.",
            "рисунок", "рис.",
            "ротапринт", "ротапр.",
            "рубль", "р.",
            "руководитель", "рук.",
            "руководство", "рук.",
            "рукопись", "рукоп.",
            "румынский", "рум.",
            "сажень", "саж.",
            "Санкт-Петербург", "СПб.",
            "санкт-петербургский", "с.-петерб.",
            "сборная схема", "сб. схема",
            "сборная таблица", "сб. табл.",
            "сборник", "сб.",
            "сборный лист", "сб. л.",
            "свыше", "св.",
            "святитель", "свт.",
            "святой", "св.",
            "священник", "свящ.",
            "сдвоенный лист", "сдв. л.",
            "Северная широта", "С",
            "северный", "сев.",
            "село", "с.",
            "сельскохозяйственный", "с.-х.",
            "сентябрь", "сент.",
            "серия", "сер.",
            "сессия", "сес.",
            "симпозиум", "симп.",
            "симфонический", "симф.",
            "систематический", "сист.",
            "сквозная печать", "сквоз. печ.",
            "склонение", "скл.",
            "скульптор", "скульпт.",
            "скульптура", "скульпт.",
            "следующий", "след.",
            "слова", "cл.",
            "словарь", "слов.",
            "смотри", "см.",
            "собрание", "собр.",
            "совещание", "совещ.",
            "совхоз", "свх.",
            "содержание", "содерж.",
            "соискание", "соиск.",
            "сокращение", "сокр.",
            "соленое озеро", "сол. оз.",
            "сообщение", "сообщ.",
            "сопровождение", "сопровожд.",
            "составитель", "сост.",
            "составление", "сост.",
            "состояние", "сост.",
            "сотрудник", "сотр.",
            "сочинение", "соч.",
            "спецификация", "специф.",
            "справочник", "справ.",
            "станица", "ст-ца",
            "станция", "ст.",
            "старший", "ст.",
            "статистический", "стат.",
            "статский советник", "стат. сов.",
            "статья", "ст.",
            "стенограмма", "стеногр.",
            "степень", "степ.",
            "стереотипный", "стер.",
            "стихийный", "стихийн.",
            "столбец", "стб.",
            "страница", "с.",
            "строительный", "строит.",
            "строительство", "стр-во",
            "строка", "стр.",
            "схиархимандрит", "схиархим.",
            "схиигумен", "схиигум.",
            "схимонах", "схим.",
            "сценарий", "сцен.",
            "сценарист", "сцен.",
            "таблица", "табл.",
            "таджикский", "тадж.",
            "тайный советник", "тайн. сов.",
            "тезисы", "тез.",
            "тетрадь", "тетр.",
            "течение", "теч.",
            "типография", "тип.",
            "титульная страница", "тит. с.",
            "титульный лист", "тит. л.",
            "то есть", "т. е.",
            "товарищество", "т-во",
            "том", "т.",
            "топограф", "топогр.",
            "торговый дом", "торг. д.",
            "транскрипция", "транскр.",
            "транслитерация", "транслит.",
            "транспонировка", "транспон.",
            "транспорт", "трансп.",
            "трафарет", "траф.",
            "труды", "тр.",
            "турецкий", "тур.",
            "увеличение", "увелич.",
            "узбекский", "узб.",
            "указатель", "указ.",
            "украинский", "укр.",
            "укрепление", "укреп.",
            "уменьшение", "уменьш.",
            "университет", "ун-т",
            "университетский", "унив.",
            "управление", "упр.",
            "урочище", "уроч.",
            "условные знаки", "усл. зн.",
            "условные обозначения", "усл. обозн.",
            "утверждение", "утв.",
            "утренний", "утр.",
            "учебник", "учеб.",
            "фабрика", "ф-ка",
            "факсимиле", "факс.",
            "факультет", "фак.",
            "фарватер", "фарв.",
            "февраль", "февр.",
            "фельдмаршал", "фельдм.",
            "физический", "физ.",
            "филармония", "филарм.",
            "филиал", "фил.",
            "философский", "филос.",
            "фильмография", "фильмогр.",
            "фламандский", "флам.",
            "фонограмма", "фоногр.",
            "фортепианный", "фортеп.",
            "фортепиано", "фп.",
            "фотограф", "фот.",
            "фотография", "фот.",
            "фотокопия", "фотокоп.",
            "фотомеханическая печать", "фотомех. печ.",
            "фототипия", "фототип.",
            "фрагмент", "фрагм.",
            "французский", "фр.",
            "фронтиспис", "фронт.",
            "футляр", "футл.",
            "химический", "хим.",
            "хозяйственный", "хоз.",
            "хозяйство", "хоз-во",
            "хореография", "хореогр.",
            "хоровой", "хор.",
            "хребет", "хр.",
            "художник", "худож.",
            "цвет", "цв.",
            "цветной", "цв.",
            "цена", "ц.",
            "цензура", "ценз.",
            "цинкография", "цинкогр.",
            "цифровой", "цифр.",
            "часть", "ч.",
            "чертеж", "черт.",
            "член", "чл.",
            "шелкография", "шелкогр.",
            "шельфовый", "шельф.",
            "школа", "шк.",
            "шмуцтитул", "шмуцтит.",
            "штат", "шт.",
            "штриховая цинкография", "штрих. цинкогр.",
            "экватор", "экв.",
            "экземпляр", "экз.",
            "электронные данные", "электрон. дан.",
            "электропечатная", "электропеч.",
            "энциклопедия", "энцикл.",
            "эстонский", "эст.",
            "Южная широта", "Ю",
            "юродивый", "юрод.",
            "язык", "яз.",
            "январь", "янв.",
            "японский", "яп."
        };

        /// <summary>
        /// Standard endings to cut off completely.
        /// </summary>
        public static string[] StandardFullEndings =
        {
            "авский", "авская", "авское", "авские",
            "адский", "адская", "адское", "адские",
            "ажный", "ажная", "ажное", "ажные",
            "азский", "азская", "азское", "азские",
            "айский", "айская", "айское", "айские",
            "альный", "альная", "альное", "альные",
            "альский", "альская", "альское", "альские",
            "анный", "анная", "анное", "анные",
            "аннский", "аннская", "аннское", "аннские",
            "арский", "арская", "арское", "арские",
            "атский", "атская", "атское", "атские",
            "ейский", "айская", "ейское", "ейские",
            "ельный", "ельная", "ельное", "ельные",
            "ельский", "ельская", "ельское", "ельские",
            "енный", "енная", "енное", "енные",
            "енский", "енская", "енское", "енские",
            "ентальный", "ентальная", "ентальное", "ентальные",
            "ерский", "ерская", "ерское", "ерские",
            "еский", "еская", "еское", "еские",
            "иальный", "иальная", "иальное", "иальные",
            "ийский", "ийская", "ийское", "ийские",
            "инский", "инская", "инское", "инские",
            "ионный", "ионная", "ионное", "ионные",
            "ирский", "ирская", "ирское", "ирские",
            "ительный", "ительная", "ительное", "ительные",
            "ический", "ическая", "ическое", "ические",
            "кий", "кая", "кое", "кие",
            "ний", "няя", "нее", "ние",
            "ной", "ная", "ное", "ные",
            "ный", "ная", "ное", "ные",
            "ованный", "ованная", "ованное", "ованные",
            "овский", "овская", "овское", "овские",
            "одский", "одская", "одское", "одские",
            "ольский", "ольская", "ольское", "ольские",
            "орский", "орская", "орское", "орские",
            "ский", "ская", "ское", "ские",
            "ской", "ская", "ское", "ские",
            "ческий", "ческая", "ческое", "ческие"
        };

        #endregion

        #region Construction

        #endregion

        #region Private members

        #endregion

        #region Public methods

        /// <summary>
        /// Shorten the word by gost.
        /// </summary>
        public static string ShortenByGost
            (
                string word
            )
        {
            for (int i = 0; i < Gost.Length; i += 2)
            {
                if (string.CompareOrdinal(word, Gost[i]) == 0)
                {
                    return Gost[i + 1];
                }
            }

            return word;
        }

        /// <summary>
        /// Shorten the word by standard full ending.
        /// </summary>
        public static string ShortenByStandardFullEnding
            (
                string word
            )
        {
            string result = word;

            int wordLength = word.Length;
            if (wordLength < 4)
            {
                return word;
            }

            foreach (string ending in StandardFullEndings)
            {
                int endingLength = ending.Length;
                int tailStart = wordLength - endingLength;
                if (tailStart < 2)
                {
                    continue;
                }

                string tail = word.Substring(tailStart).ToLower();
                if (string.CompareOrdinal(tail, ending) != 0)
                {
                    continue;
                }

                string head = word.Substring(0, tailStart);
                char last = head[head.Length - 1];
                while ((tailStart < wordLength)
                        &&
                        (
                            last == 'а' || last == 'А' || last == 'е' || last == 'Е'
                         || last == 'ё' || last == 'Ё' || last == 'и' || last == 'И'
                         || last == 'й' || last == 'Й' || last == 'о' || last == 'О'
                         || last == 'э' || last == 'Э' || last == 'ы' || last == 'Ы'
                         || last == 'ю' || last == 'Ю' || last == 'я' || last == 'Я'
                         || last == 'ь' || last == 'Ь'
                        )
                    )
                {
                    head = head + word[tailStart];
                    tailStart++;
                }
                if (head[tailStart - 1] == head[tailStart - 2])
                {
                    head = head.Substring(0, tailStart - 1);
                    //tailStart--;
                }

                head = head + '.';

                if (result.Length > head.Length)
                {
                    result = head;
                }
            }

            return result;
        }

        #endregion

    }
}
